﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CuaHangMayTinh.BusinessEntities;
using CuaHangMayTinh.DataProvider;
using CuaHangMayTinh.Utilities;
using System.Data;

namespace CuaHangMayTinh.DataAccessLayer
{
    public class NhanVienDA
    {
        public NhanVienDA()
        {

        }

        /// <summary>
        /// Hàm thêm 1 nhân viên mới
        /// </summary>
        /// <param name="entity">1 NhanVienEntity cần được thêm mới vào CSDL</param>
        /// <returns></returns>
        public int Insert(NhanVienEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();

                pb.AddParameter("TenNV", entity.TenNV);
                pb.AddParameter("CMND", entity.CMND);
                pb.AddParameter("NghiepVu", entity.NghiepVu);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);
                pb.AddParameter("NgaySinh", entity.NgaySinh);
                pb.AddParameter("GioiTinh", entity.GioiTinh);
                pb.AddParameter("TinhTrang", entity.TinhTrang);
                pb.AddParameter("GhiChu", entity.GhiChu);
                return (int)DBFactory.Database.ExecuteNonQuery("NhanVien_Insert", pb.Parameters);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// hàm thêm 1 nhân viên mới trả về Id
        /// </summary>
        /// <param name="entity">1 NhanVienEntity cần được thêm mới vào CSDl</param>
        /// <returns></returns>
        public int InsertGetID(NhanVienEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();

                pb.AddParameter("TenNV", entity.TenNV);
                pb.AddParameter("CMND", entity.CMND);
                pb.AddParameter("NghiepVu", entity.NghiepVu);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);
                pb.AddParameter("NgaySinh", entity.NgaySinh);
                pb.AddParameter("GioiTinh", entity.GioiTinh);
                pb.AddParameter("TinhTrang", entity.TinhTrang);
                pb.AddParameter("GhiChu", entity.GhiChu);
                return (int)DBFactory.Database.ExecuteNonQueryGetID("NhanVien_Insert", pb.Parameters);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// hàm cập nhật thông tin của 1 nhân viên
        /// </summary>
        /// <param name="entity">1 NhanVienEntity cần được cập nhật vào CSDl</param>
        /// <returns></returns>
        public bool UpDate(NhanVienEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("MaNV", entity.MaNV);
                pb.AddParameter("TenNV", entity.TenNV);
                pb.AddParameter("CMND", entity.CMND);
                pb.AddParameter("NghiepVu", entity.NghiepVu);
                pb.AddParameter("DiaChi", entity.DiaChi);
                pb.AddParameter("SoDT", entity.SoDT);
                pb.AddParameter("Email", entity.Email);
                pb.AddParameter("NgaySinh", entity.NgaySinh);
                pb.AddParameter("GioiTinh", entity.GioiTinh);
                pb.AddParameter("TinhTrang", entity.TinhTrang);
                pb.AddParameter("GhiChu", entity.GhiChu);

                int numRowEffected = DBFactory.Database.ExecuteNonQuery("NhanVien_Upbate", pb.Parameters);
                return (numRowEffected > 0);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// hàm cập nhật tình trạng của 1 nhân viên
        /// </summary>
        /// <param name="entity">1 NhanVienEntity cần được cập nhật vào CSDl</param>
        /// <returns></returns>
        public bool UpDate_TinhTrang(NhanVienEntity entity)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("MaNV", entity.MaNV);
                pb.AddParameter("TinhTrang", entity.TinhTrang);

                int numRowEffected = DBFactory.Database.ExecuteNonQuery("NhanVien_Upbate_TinhTrang", pb.Parameters);
                return (numRowEffected > 0);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// hàm lấy tất cả thông tin về nhân viên
        /// </summary>
        /// <param name="View"></param>
        /// <returns>DataTable chứa thông tin của nhân viên</returns>
        public DataTable Find_All(bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_All", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm tìm thông tin nhân viên theo tên
        /// </summary>
        /// <param name="ten"></param>
        /// <param name="View"></param>
        /// <returns></returns>
        public DataTable Find_Ten(string ten, bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("TenNV", ten);
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_Ten", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm tìm thông tin nhân viên theo mã nhân viên
        /// </summary>
        /// <param name="id"></param>
        /// <param name="View"></param>
        /// <returns>DataTable chứa thông tin của nhân viên</returns>
        public DataTable Find_ID(int id, bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("MaNV", id);
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_ID", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm tìm thông tin nhân viên theo cmnd
        /// </summary>
        /// <param name="CMND"></param>
        /// <param name="View"></param>
        /// <returns>DataTable chứa thông tin của nhân viên</returns>
        public DataTable Find_CMND(string CMND, bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("CMND", CMND);
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_CMND", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm tìm thông tin nhân viên theo nghiệp vụ
        /// </summary>
        /// <param name="nghiepVu"></param>
        /// <param name="View"></param>
        /// <returns>DataTable chứa thông tin của nhân viên</returns>
        public DataTable Find_NghiepVu(string nghiepVu, bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("NghiepVu", nghiepVu);
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_NghiepVu", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm getid cua nhân viên bằng cmnd của nhân viên đó
        /// </summary>
        /// <param name="cmnd"></param>
        /// <returns></returns>
        public int GetID(string cmnd)
        {
            try
            {
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("CMND", cmnd);

                int kq = (int)DBFactory.Database.ExecuteScalar("NhanVien_GetID", pb.Parameters);
                return kq;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="IDSGU"></param>
        /// <param name="View"></param>
        /// <returns></returns>
        public DataTable Find_SubGroupUser(int IDSGU, bool View)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("IDGroupUser", IDSGU);
                pb.AddParameter("View", View);

                dt = DBFactory.Database.FillDataTable("NhanVien_Find_SubGroupUser", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="UserName"></param>
        /// <param name="Pass"></param>
        /// <returns></returns>
        public DataTable DangNhap(string UserName, string Pass)
        {
            try
            {
                DataTable dt = new DataTable();
                ParameterBuilder pb = DBFactory.CreateParamBuilder();
                pb.AddParameter("UserName", UserName);
                pb.AddParameter("Pass", Pass);

                dt = DBFactory.Database.FillDataTable("NhanVien_DangNhap", pb.Parameters);
                return dt;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// hàm xóa nhân viên theo mã
        /// </summary>
        /// <param name="id">Mã của nhân viên muốn xóa trên CSDL</param>
        /// <returns></returns>
        public bool Delete(int id)
        {
            try
            {
                ParameterBuilder pd = DBFactory.CreateParamBuilder();
                pd.AddParameter("MaNV", id);

                return DBFactory.Database.ExecuteNonQuery("NhanVien_Delete", pd.Parameters) > 0;
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// Hàm chuyển 1 DataTable chứa thông tin về nhân viên sang 1 List NhanVienEntity
        /// </summary>
        /// <param name="dt">1 datatable chứa NhanVienEntity</param>
        /// <returns>trả về 1 List NhanVienEntity</returns>
        public List<NhanVienEntity> ConvertToList(DataTable dt)
        {
            List<NhanVienEntity> list = new List<NhanVienEntity>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                int id = (int)dt.Rows[i][0];
                string ht = dt.Rows[i][1].ToString();
                string cmnd = dt.Rows[i][2].ToString();
                int nv = (int)dt.Rows[i][3];
                string diachi = dt.Rows[i][4].ToString();
                string dth = dt.Rows[i][5].ToString();
                string email = dt.Rows[i][6].ToString();
                DateTime ns = (DateTime)dt.Rows[i][7];
                bool gt = (bool)dt.Rows[i][8];
                int tinhtrang = (int)dt.Rows[i][9];
                string ghichu = dt.Rows[i][10].ToString();

                NhanVienEntity a = new NhanVienEntity(id, ht, cmnd, nv, diachi, dth, email, ns, gt, tinhtrang, ghichu);
                list.Add(a);
            }
            return list;
        }

    }
}


